home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / im-switch < prev    next >
Text File  |  2008-01-08  |  14KB  |  407 lines

  1. #!/bin/sh
  2. # Copyright (C) 2006        Osamu Aoki  <osamu@debian.org>
  3. # Copyright (C) 2005 - 2006 Kenshi Muto <kmuto@debian.org>
  4. #  Modified for Debian package.
  5. # Copyright (C) 1999 - 2004 Red Hat, Inc. All rights reserved. This
  6. # copyrighted material is made available to anyone wishing to use, modify,
  7. # copy, or redistribute it subject to the terms and conditions of the
  8. # GNU General Public License version 2.
  9. #
  10. # You should have received a copy of the GNU General Public License
  11. # along with this program; if not, write to the Free Software
  12. # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  13.  
  14. # system wide configuration directory
  15. XINPUT_PATH=/etc/X11/xinit/xinput.d
  16. # user specific customization directory
  17. DOTXINPUT_PATH=${HOME}/.xinput.d
  18. # All im-switch related alternatives start with xinput-
  19. ALTER_XINPUT=/etc/alternatives/xinput-
  20. # location for special hook scripts installed by each IM packages
  21. HOOKDIR=/usr/share/im-switch
  22.  
  23. # $LNG is locale <languag>e_<region> without .<encoding> and .<encoding>@EURO
  24. LNG=${LC_ALL:-${LC_CTYPE:-${LANG}}}
  25. LNG=${LNG%@*}
  26. LNG=${LNG%.*}
  27.  
  28. [ -z "$LNG" ] && LNG="all_ALL" || true
  29.  
  30. USERID=$(id -u)
  31. VER=0.3+debian1.10
  32.  
  33. VERBOSE=0
  34.  
  35. # echo to STDERR when VERBOSE is on.
  36. vecho() {
  37.     if [ $VERBOSE -eq 1 ] ; then
  38.         echo "$1" >&2
  39.     fi
  40. }
  41.  
  42. # echo local setups to STDERR when VERBOSE is on.
  43. vlang() {
  44.     if [ $VERBOSE -eq 1 ] ; then
  45.       echo "LC_ALL=\"$LC_ALL\"" >&2
  46.       echo "LC_CTYPE=\"$LC_CTYPE\"" >&2
  47.       echo "LANG=\"$LANG\"" >&2
  48.       echo "LNG=\"$LNG\"" >&2
  49.     fi
  50. }
  51.  
  52. # echo command line info to STDERR when VERBOSE is on.
  53. errcmd() {
  54. echo "Error: \"${0##*/}\" invoked with \"$ORGAT\" as options." >&2
  55. echo "Error: Try \"${0##*/} -h\" for usage." >&2
  56. }
  57.  
  58. # echo missing dependency information for $1=$LNG
  59. dependency() {
  60.     if [ -z "$1" ] ; then
  61.         return
  62.     fi
  63.     if [ -r  ${HOME}/$(basename "$1") ]; then
  64.         DEPENDS=$(grep -e "DEPENDS=" ${HOME}/$(basename $1) | sed -e 's/DEPENDS=//' -e 's/"//g')
  65.     elif [ -r "${XINPUT_PATH}/$1" ]; then
  66.         DEPENDS=$(grep -e "DEPENDS=" $XINPUT_PATH/$1 | sed -e 's/DEPENDS=//' -e 's/"//g')
  67.     else
  68.         DEPENDS=""
  69.     fi
  70.     vecho "From the package dependency information requires"
  71.     vecho "  \"$DEPENDS\"."
  72.     if [ -z "$DEPENDS" ]; then
  73.         return
  74.     fi
  75.     RESULT=""
  76.     # split with ","
  77.     IFS=","
  78.     for i in `echo "$DEPENDS"`; do 
  79.         INSTALLED=0
  80.     # split with |
  81.     IFS="|"
  82.     for j in `echo "$i"`; do 
  83.             unset IFS
  84.             vecho "checking status of \"$j\" package"
  85.             if dpkg -s $j 2>/dev/null | grep -q -e "Status: install ok installed" ; then
  86.                 vecho "+++ \"$j\" package is installed."
  87.                 INSTALLED=1
  88.             else
  89.                 vecho "---- \"$j\" package is NOT installed."
  90.             fi
  91.         done
  92.     done
  93.     if [ $INSTALLED -eq 0 ]; then 
  94.         if [ -z "$RESULT" ]; then
  95.             RESULT="( $i )"
  96.         else
  97.             RESULT="${RESULT} and ( $i )"
  98.         fi
  99.     fi
  100.     if [ -n "$RESULT" ]; then
  101.         echo "Please install following packages:"
  102.         echo "  $(echo \"$RESULT\" | sed -e 's/|/ or /g') ."
  103.     fi
  104. }
  105.  
  106. # echo current system wide default IM setup name
  107. current_system_im () {
  108.     if [ -r "${ALTER_XINPUT}${LNG}" ]; then
  109.     /usr/sbin/update-alternatives --display xinput-$LNG | \
  110.     sed -ne 's/ link currently points to \(.*\)/\1/p' | \
  111.     sed -e "s%${XINPUT_PATH}/%%"
  112.     elif [ -r "${ALTER_XINPUT}all_ALL" ]; then
  113.     /usr/sbin/update-alternatives --display xinput-all_ALL | \
  114.     sed -ne 's/ link currently points to \(.*\)/\1/p' | \
  115.     sed -e "s%${XINPUT_PATH}/%%"
  116.     else
  117.     echo "No system wide default \"${ALTER_XINPUT}${LNG} or ${ALTER_XINPUT}all_ALL\" is defined."
  118.     exit 1
  119.     fi
  120. }
  121.  
  122. # echo current user IM setup name
  123. current_user_im () {
  124.     readlink ${DOTXINPUT_PATH}/$LNG | \
  125.     sed -e "s%${XINPUT_PATH}/%%" -e "s%${DOTXINPUT_PATH}/%~/.xinput.d/%"
  126. }
  127.  
  128. # echo IM setup candidates
  129. possible_im () {
  130.     ( (/usr/bin/find $XINPUT_PATH    -type f| sed -e "s%$XINPUT_PATH/%%") ; \
  131.       (/usr/bin/find $DOTXINPUT_PATH -type f| sed -e "s%$DOTXINPUT_PATH/%%" ; ) ) | \
  132.     sort -u
  133.     # XXX FIXME : should test for executable
  134. }
  135.  
  136. # run system hook script when system wide IM setup is changed
  137. # So far, I have not see its use yet.
  138. #   $PREVIOUS
  139. #   $DEFAULT
  140. runhookscripts () {
  141.     if [ "$DEFAULT" != "$PREVIOUS" ]; then
  142.         [ "$PREVIOUS" -a -x "$HOOKDIR/$PREVIOUS" ] &&  $HOOKDIR/$PREVIOUS remove
  143.         [ "$DEFAULT" -a -x "$HOOKDIR/$DEFAULT" ] &&  $HOOKDIR/$DEFAULT install
  144.     fi
  145. }
  146.  
  147. list() {
  148.     echo "Your input method setup under $LNG locale as below."
  149.     echo "======================================================="
  150.     if [ "$USERID" -eq 0 ]; then
  151.         echo "No private configuration can be defined for root account."
  152.     elif [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
  153.         if [ -L "${DOTXINPUT_PATH}/${LNG}" ]; then
  154.       echo "The configuration \"${DOTXINPUT_PATH}/${LNG}\" is defined as a link pointing to"
  155.       echo "$(basename $(readlink "${DOTXINPUT_PATH}/${LNG}"))"
  156.         else
  157.       echo "The private configuration is a static file \"${DOTXINPUT_PATH}/${LNG}\" ."
  158.         fi
  159.     echo "This private configuration supersedes the system wide default."
  160.     elif [ -L "${DOTXINPUT_PATH}/all_ALL" ]; then
  161.         if [ -L "${DOTXINPUT_PATH}/all_ALL" ]; then
  162.       echo "The configuration \"${DOTXINPUT_PATH}/all_ALL\" is defined as a link pointing to"
  163.       echo "$(basename $(readlink "${DOTXINPUT_PATH}/all_ALL"))"
  164.         else
  165.       echo "The private configuration is a static file \"${DOTXINPUT_PATH}/all_ALL\" ."
  166.         fi
  167.     echo "This private configuration supersedes the system wide default."
  168.     else
  169.     echo "No private \"${DOTXINPUT_PATH}/${LNG} or ${DOTXINPUT_PATH}/all_ALL\" is defined."
  170.     fi
  171.     echo "======================================================="
  172.     if [ -r "${ALTER_XINPUT}${LNG}" ]; then
  173.     echo "The system wide default is pointed by \"${ALTER_XINPUT}${LNG}\" ."
  174.     /usr/sbin/update-alternatives --display xinput-$LNG | sed -e "s%$XINPUT_PATH/%%"
  175.     elif [ -r "${ALTER_XINPUT}all_ALL" ]; then
  176.     echo "The system wide default is pointed by \"${ALTER_XINPUT}all_ALL\" ."
  177.     /usr/sbin/update-alternatives --display xinput-all_ALL | sed -e "s%$XINPUT_PATH/%%"
  178.     else
  179.     echo "No system wide default \"${ALTER_XINPUT}${LNG} or ${ALTER_XINPUT}all_ALL\" is defined."
  180.     fi
  181.     vecho "======================================================="
  182.     vecho "The system wide default input methods are available for the locales:"
  183.     for i in `/bin/ls $ALTER_XINPUT* | sed -e "s%$ALTER_XINPUT%%"`; do
  184.         vecho -n "$i "
  185.     done
  186.     vecho
  187.     echo "======================================================="
  188.     echo "The available input method configuration files are:"
  189.     for i in `possible_im` ; do
  190.         if [ -r $DOTXINPUT_PATH/$i ]; then
  191.             echo -n "~/.xinput.d/$i "
  192.         else
  193.             echo -n "$i "
  194.         fi
  195.     done
  196.     echo
  197.     vecho "======================================================="
  198.     vecho "The available input method hook scripts are in $HOOKDIR:"
  199.     for i in `/usr/bin/find $HOOKDIR -type f| sed -e "s%$HOOKDIR/%%"`; do
  200.         vecho -n "$i "
  201.     done
  202.     vecho
  203.     echo "======================================================="
  204. }
  205.  
  206. # set IM to defaults
  207. auto() {
  208.     if [ "$USERID" -eq 0 ]; then
  209.         if [ ! -r "${ALTER_XINPUT}${LNG}" ]; then
  210.         echo "No system wide default defined just for locale ${LNG} ."
  211.         echo "Use \"all_ALL\" quasi-locale and set IM."
  212.             LNG="all_ALL"
  213.         fi
  214.     PREVIOUS=$(current_system_im)
  215.     /usr/sbin/update-alternatives --auto xinput-$LNG
  216.     else
  217.     if [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
  218.         PREVIOUS=$(current_user_im)
  219.         mv ${DOTXINPUT_PATH}/${LNG} ${DOTXINPUT_PATH}/${LNG}.backup
  220.     fi
  221.     fi
  222.     DEFAULT=$(current_system_im)
  223.     dependency $DEFAULT
  224.     runhookscripts
  225. }
  226.  
  227. # set im setup pointing to to $1 script in $XINPUT_PATH
  228. setalt() {
  229.     if [ "$USERID" -eq 0 ]; then
  230.         vecho "You are root user."
  231.         # sanity check
  232.         if [ ! -r "$XINPUT_PATH/$1" ] ; then
  233.             echo "Error: no system wide configuration file \"$1\" exists." >&2
  234.         echo "Error: No action taken." >&2
  235.             exit 1
  236.         fi
  237.     if [ ! -r "${ALTER_XINPUT}${LNG}" ]; then
  238.         echo "No system wide default defined just for locale $LNG ."
  239.         echo "Use \"all_ALL\" quasi-locale and set IM."
  240.             LNG="all_ALL"
  241.     fi
  242.     PREVIOUS=$(current_system_im)
  243.     /usr/sbin/update-alternatives --set xinput-$LNG $XINPUT_PATH/${1}
  244.         DEFAULT=$(current_system_im)
  245.         vecho "Changed system wide default from $PREVIOUS to $DEFAULT."
  246.     else
  247.         # sanity check
  248.         if [ ! -r "$XINPUT_PATH/${1}" -a ! -r "$DOTXINPUT_PATH/${1}" ] ; then
  249.             echo "Error: no configuration file \"${1}\" exists." >&2
  250.         echo "Error: No action taken." >&2
  251.             exit 1
  252.         fi
  253.         vecho "You are non-root user."
  254.     if [ ! -d ${DOTXINPUT_PATH} ]; then
  255.         mkdir -p ${DOTXINPUT_PATH}
  256.             vecho "Creating  ${DOTXINPUT_PATH} directory."
  257.         fi
  258.     if [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
  259.         PREVIOUS=$(current_user_im)
  260.             mv ${DOTXINPUT_PATH}/${LNG} ${DOTXINPUT_PATH}/${LNG}.backup
  261.             vecho "Backed up user configuration pointing to $PREVIOUS."
  262.     fi
  263.         if [ -r "$DOTXINPUT_PATH/${1}" ] ; then
  264.             ln -s $DOTXINPUT_PATH/${1} ${DOTXINPUT_PATH}/$LNG
  265.         else
  266.             ln -s $XINPUT_PATH/${1} ${DOTXINPUT_PATH}/$LNG
  267.         fi
  268.         DEFAULT=$(current_user_im)
  269.         vecho "Set user configuration pointing to $DEFAULT."
  270.     fi
  271.     dependency "$DEFAULT"
  272.     runhookscripts
  273. }
  274.  
  275. # set im setup pointing to to a script in $XINPUT_PATH by menu
  276. cfgalt() {
  277.     if [ "$USERID" -eq 0 ]; then
  278.         vecho "You are root user."
  279.     if [ ! -r "${ALTER_XINPUT}${LNG}" ]; then
  280.         echo "No system wide default defined just for locale $LNG ."
  281.         echo "Use \"all_ALL\" quasi-locale and set IM."
  282.             LNG="all_ALL"
  283.     fi
  284.     PREVIOUS=$(current_system_im)
  285.         echo    "System wide default for ${LNG} locale is marked with [+]."
  286.     /usr/sbin/update-alternatives --config xinput-$LNG
  287.         DEFAULT=$(current_system_im)
  288.         vecho "Changed system wide default from $PREVIOUS to $DEFAULT."
  289.     else
  290.         vecho "You are non-root user."
  291.     if [ ! -d ${DOTXINPUT_PATH} ]; then
  292.         mkdir -p ${DOTXINPUT_PATH}
  293.             vecho "Creating  ${DOTXINPUT_PATH} directory."
  294.         fi
  295.         PREVIOUS_SYS=$(current_system_im)
  296.     if [ -r "${DOTXINPUT_PATH}/${LNG}" ]; then
  297.         PREVIOUS_USR=$(current_user_im)
  298.             cp -a ${DOTXINPUT_PATH}/${LNG} ${DOTXINPUT_PATH}/${LNG}.backup
  299.             vecho "Backed up user configuration pointing to $PREVIOUS."
  300.     fi
  301.         vecho "    PREVIOUS_SYS=\"$PREVIOUS_SYS\""
  302.         vecho "    PREVIOUS_USR=\"$PREVIOUS_USR\""
  303.         COUNT=`possible_im | wc -l`
  304.         echo
  305.         echo "There are $COUNT candidates which provide IM for ${DOTXINPUT_PATH}/${LNG}:"
  306.         echo
  307.         echo "  Selection    Alternative"
  308.         echo "  -----------------------------------------------"
  309.         INDEX=0
  310.         for i in `possible_im`; do
  311.             INDEX=$(($INDEX+1))
  312.             if [ -r $DOTXINPUT_PATH/$i ]; then
  313.                 if [ "$PREVIOUS_USR" = "~/.xinput.d/$i" ]; then
  314.                     echo -n "*"
  315.                 else
  316.                     echo -n " "
  317.                 fi
  318.                 if [ "$PREVIOUS_SYS" = "~/.xinput.d/$i" ]; then
  319.                     echo -n "+"
  320.                 else
  321.                     echo -n " "
  322.                 fi
  323.                 echo "    $INDEX        ~/.xinput.d/$i "
  324.             else
  325.                 if [ "$PREVIOUS_USR" = "$i" ]; then
  326.                     echo -n "*"
  327.                 else
  328.                     echo -n " "
  329.                 fi
  330.                 if [ "$PREVIOUS_SYS" = "$i" ]; then
  331.                     echo -n "+"
  332.                 else
  333.                     echo -n " "
  334.                 fi
  335.                 echo "    $INDEX        $i"
  336.             fi
  337.         done
  338.         echo    "System wide default for ${LNG} (or all_ALL) locale is marked with [+]."
  339.         echo -n "Press enter to keep the current selection[*], or type selection number: "
  340.         read SEL
  341.         echo
  342.         if [ -z "$SEL" ]; then
  343.             SEL=0
  344.         fi
  345.         INDEX=0
  346.         for i in `possible_im`; do
  347.             INDEX=$(($INDEX+1))
  348.             if [ "$SEL" -eq "$INDEX" ]; then
  349.                 if [ -r "$DOTXINPUT_PATH/$i" ] ; then
  350.                     ln -fs $DOTXINPUT_PATH/$i ${DOTXINPUT_PATH}/$LNG
  351.                 else
  352.                     ln -fs $XINPUT_PATH/$i ${DOTXINPUT_PATH}/$LNG
  353.                 fi
  354.             fi
  355.         done
  356.     fi
  357.     DEFAULT=$(current_user_im)
  358.     vecho "Set user configuration pointing to $DEFAULT."
  359.     dependency "$DEFAULT"
  360.     runhookscripts
  361. }
  362.  
  363. help() {
  364. echo "Input Method Switcher $VER"
  365. echo ""
  366. echo "\"${0##*/}\" configures the input method to be automatically switched based "
  367. echo "on the locale (ll_CC) using Debian \"update-alternatives\" mechanism."
  368. echo "When \"${0##*/}\" is invoked from root user, it sets system wide alternatives."
  369. echo ""
  370. echo "Usage: ${0##*/} [-v][-z ll_CC] -s inputmethodname"
  371. echo "           to set a specific input method for the language"
  372. echo "       ${0##*/} [-v][-z ll_CC] -c"
  373. echo "           to set an input method for the language by menu"
  374. echo "       ${0##*/} [-v][-z ll_CC] -a"
  375. echo "           to revert to the default input method for the language"
  376. echo "       ${0##*/} [-v][-z ll_CC] -l"
  377. echo "           to list current settings and available input methods for"
  378. echo "           the language, and also all the available languages"
  379. echo "       ${0##*/} -h"
  380. echo "           to show this help"
  381. echo ""
  382. echo "The \"ll_CC\" argument of -z takes the form \"<language>_<teritory>\" and "
  383. echo "is used to override the current locale (ISO 639 / ISO 3188) : eg \"-z ja_JP\""
  384. echo ""
  385. echo "The use of -v option produces verbose outputs."
  386. echo ""
  387. }
  388.  
  389. ORGAT="$@"
  390.  
  391. while getopts "vfz:als:ch" OPTION; do
  392.     case $OPTION in
  393.         v) VERBOSE=1;;
  394.         z) vlang; LNG="$OPTARG"; LNG=${LNG%@*}; LNG=${LNG%.*};;
  395.         a) vlang; auto; exit 0;;
  396.         l) vlang; list; exit 0;;
  397.         s) vlang; setalt "$OPTARG"; exit 0;;
  398.         c) vlang; cfgalt; exit 0;;
  399.         h) vlang; help; exit 0;;
  400.     ?) errcmd; exit 1;;
  401.     esac
  402. done
  403.  
  404. # If no option or only with -d or/and -z
  405. errcmd
  406. exit 1
  407.